#ifndef STORAGE_MANAGER_H
#define STORAGE_MANAGER_H

#include <string>
#include <set>
#include <vector>
#include <StorageTypes.hpp>
// #include "./Structures/StorageTypes.hpp"
class StorageManager
{
public:
    StorageManager();
    ~StorageManager();
    /**
     * @brief 获取系统可用的磁盘名称列表 / Get the list of available disk names
     *
     * @details
     * 此函数将检测系统中所有可用的磁盘，并将它们的名称存入指定的字符串向量中。
     * This function detects all available disks on the system and stores their names in the given string vector.
     *
     * @param[out] disks_list 用于接收磁盘名称列表的字符串向量（调用前会被清空）
     *             A reference to a string vector that will be filled with disk names (will be cleared before population).
     *
     * @return int
     *         成功返回 0，失败返回非零错误码（具体错误码参考类文档）。
     *         Returns 0 on success, or a non-zero error code on failure (refer to class documentation for error codes).
     */
    int GetDiskNameList(std::vector<std::string> &disks_list);
    /**
     * @brief 获取单个磁盘的详细信息 / Get detailed information of a single disk
     *
     * @details
     * 根据磁盘设备路径（如 "/dev/sda"）查询磁盘信息，包括分区列表、总空间、剩余空间等。
     * Queries disk information (including partition list, total space, free space, etc.)
     * based on the disk device path (e.g., "/dev/sda").
     *
     * @param[out] disk_info 输出参数，包含以下磁盘信息结构体：
     *            Output parameter, contains the following disk information structure:
     *            - disk_device_path: 磁盘设备路径 / Disk device path
     *            - disk_id: 磁盘唯一标识符 / Disk unique identifier
     *            - disk_total_space_mbyte: 磁盘总空间(MB) / Total disk space in MB
     *            - disk_free_space_mbyte: 磁盘剩余空间(MB) / Free disk space in MB
     *            - p_partitions_list: 指向分区列表的指针，包含每个分区的：
     *              Pointer to partition list, containing for each partition:
     *              - partition_device_path: 分区设备路径 / Partition device path
     *              - total_space_mbyte: 分区总空间(MB) / Partition total space in MB
     *              - free_space_mbyte: 分区剩余空间(MB) / Partition free space in MB
     *              - mount_point: 挂载点 / Mount point
     *            - partition_numbers: 分区数量 / Number of partitions
     *           调用方不用负责释放 p_partitions_list 分配的内存，函数会深拷贝赋新值
     *            Note: Caller is responsible for freeing p_partitions_list memory
     *
     * @param[in] disk_device_path 输入参数，目标磁盘的设备路径（如 "/dev/sda"）
     *            Input parameter, device path of the target disk (e.g., "/dev/sda").
     *
     * @return int
     *         成功返回 0，失败返回非零错误码：
     *         Returns 0 on success, non-zero error code on failure:
     *         - 1: 无效设备路径 / Invalid device path
     *         - 2: 内存未分配 / Memory not allocated
     *         - 3: IO 操作失败 / Disk I/O error
     */
    int GetSingleDiskInfo(SinglePhysicalDiskInfo &disk_info, std::string disk_device_path);

    /**
     * @brief 获取磁盘信息列表 / Get disk information list
     *
     * @param[out] disks_list 输出参数，用于接收磁盘信息列表。函数会进行深拷贝，调用者无需预分配内存。
     *               Output parameter to receive disk information list.
     *               The function performs deep copy, caller doesn't need to pre-allocate memory.
     *
     * @return int 返回操作状态码 / Return operation status code
     *             - 0: 成功 / Success
     *             - 1: 错误码，表示具体错误 / Non-zero: Error code indicating specific failure
     *
     *
     *
     * @warning 返回的指针数据在StorageManager析构后将变为无效。
     *          The pointer data will become invalid after StorageManager destruction.
     *
     * 示例/Example:
     * @code
     * DataStructure disks;
     * if (GetDiskInfoList(disks) == 0) {
     *     // 处理磁盘信息 / Process disk info
     * }
     * @endcode
     */
    int GetDiskInfoList(DataStructure &disks_list);

    void RunTest();
    int PrintDiskInfo();
    int printSinglePartitionInfo(const SinglePhysicalPartitionInfo &partition);
    int printSingleDiskInfo(const SinglePhysicalDiskInfo &disk);
    int printDataStructure(const DataStructure &data);

private:
    // 数据段
    DataStructure m_disks_info;
    // static std::set<std::string> disk_names;

    // 直接调用函数
    int UpdateDisksInfo(); // disks_info信息更新
    int DiskOperate();//磁盘写操作调用函数
    // int 
    // Return_type return_info();//得到调用本函数时期的系统磁盘信息
    // std::string return_info_jSON();//JSON化的调用本函数时的系统磁盘信息

    // 间接调用函数

    int IsPhysicalDisk(std::string disk_device_path);                                         // 0不是，1是。-1错误信息
    std::set<std::string> InitDisksInfo();                                                    // 从硬件层面获取，写入内存信息，只调用一次。                                        // 更新磁盘路径信息
    std::vector<std::string> GetSataDevicePathsOfPartitions(const std::string &disk_device_path); // 获得硬盘分区名
    int SaveDiskNameToStruct(std::string disk_device_path);
    int FindTheheIndexOfOneDiskInTheList(std::string disk_device_path); // 值表示下标，-1表示不存在，

    int InitPartitionsInfo(std::string disk_device_path);                                  // 分区信息初始化函数
    std::string GetMountPointFromPartitioName(const std::string &partition_device_path);   // 获得分区挂载点
    std::vector<int> GetPartitionSpaceInfo(const std::string &partition_mount_point_path); //[0]是total_space，[1]是free_space
    int CompleteDiskInfo(std::string disk_device_path);                                    // 回填磁盘可用空间，获得磁盘总空间，
    std::vector<int> GetNotMountedPartitionSpaceInfo(const std::string &partition_device_path);
    bool isUserInDiskGroup();//Deprecated
    std::string FindPartitionUUID(std::string partition_device_path);

};

#endif // STORAGE_MANAGER_H